﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using LGPeWJNM.BaseClasses;

namespace BatchDesvPad
{
    public static class Extensions
    {
        public static XElement ResultadoToXml(this System.Xml.Serialization.XmlSerializer ResultadoSerializer, LGPeWJNM.DataAccessLayer.Resultado resultado, System.Diagnostics.Stopwatch resultadoStopwatch, System.Diagnostics.Stopwatch medianaStopwatch, System.Diagnostics.Stopwatch clusterizacaoStopwatch, System.Diagnostics.Stopwatch roteirizacaoStopwatch, System.Diagnostics.Stopwatch otimizacaoStopwatch, System.Diagnostics.Stopwatch saveStopwatch, Exception exception)
        {
            var xDoc = new XDocument();
            using (var xmlWriter = xDoc.CreateWriter())
                ResultadoSerializer.Serialize(xmlWriter, resultado);
            var xResultado = ((XElement)xDoc.FirstNode);
            if (xResultado.Element("Mediana") != null)
                xResultado.Element("Mediana").Add(
                    new XAttribute("Tempo", medianaStopwatch.ElapsedMilliseconds),
                    new XAttribute("Ticks", medianaStopwatch.ElapsedTicks));
            if (xResultado.Element("Clusterizacao") != null)
                xResultado.Element("Clusterizacao").Add(
                    new XAttribute("Tempo", clusterizacaoStopwatch.ElapsedMilliseconds),
                    new XAttribute("Ticks", clusterizacaoStopwatch.ElapsedTicks));
            if (xResultado.Element("Roteirizacao") != null)
                xResultado.Element("Roteirizacao").Add(
                    new XAttribute("Custo", resultado.Roteirizacao.CustoTotal()),
                    new XAttribute("Tempo", roteirizacaoStopwatch.ElapsedMilliseconds),
                    new XAttribute("Ticks", roteirizacaoStopwatch.ElapsedTicks));
            if (xResultado.Element("Otimizacao") != null)
                xResultado.Element("Otimizacao").Add(
                    new XAttribute("Custo", resultado.Otimizacao.CustoTotal()),
                    new XAttribute("Tempo", otimizacaoStopwatch.ElapsedMilliseconds),
                    new XAttribute("Ticks", otimizacaoStopwatch.ElapsedTicks));
            xResultado.Add(
                new XAttribute("Tempo", resultadoStopwatch.ElapsedMilliseconds),
                new XAttribute("Ticks", resultadoStopwatch.ElapsedTicks));
            if (exception != null)
                xResultado.Add(new LGPeWJNM.DataAccessLayer.ExceptionXElement(exception));
            saveStopwatch.Stop();
            xResultado.Add(
                new XAttribute("TempoDeSalva", saveStopwatch.ElapsedMilliseconds),
                new XAttribute("TicksDeSalva", saveStopwatch.ElapsedTicks));
            return xResultado;
        }
    }
}